//
// Created by Zxy on 2020/8/16.
//

#ifndef QUICK_SORT_QUICKSORT_BASIC_H
#define QUICK_SORT_QUICKSORT_BASIC_H
#include <iostream>
#include <cassert>
#include <ctime>
using namespace std;

// 对arr[l...r]部分进行partition操作
// 返回p，使arr[l...p-1] < arr[p]; arr[p+1...r] > arr[p]
template <typename T>
int partition_basic(T arr[], int l, int r){
    T v = arr[l];
    // arr[l+1...j] < v; arr[j+1...i) > v
    // 初始状态时两个区间都为空
    int j = l;
    for(int i = l + 1; i <= r; ++i){
        if(arr[i] < v){
            swap(arr[j + 1], arr[i]);
            j++;
        }
    }
    swap(arr[l], arr[j]);
    return j;
}

// 对arr[l...r]部分进行快速排序
template <typename T>
void __quickSort_basic(T arr[], int l, int r){
    if(l >= r) return;
    int p = partition_basic(arr, l, r);
    __quickSort_basic(arr, l, p - 1);
    __quickSort_basic(arr, p + 1, r);
}

template <typename T>
void quickSort_basic(T arr[], int n){
    __quickSort_basic(arr, 0, n - 1);
}

#endif //QUICK_SORT_QUICKSORT_BASIC_H
